# Como Avaliar se um RAG é Correto

**Regra base:** RAG correto = resposta correta e suportada pelos documentos recuperados.

## 1. Dimensões-chave de Avaliação (Framework)

### 1️⃣ Relevância da Recuperação (Retrieval Quality)
**Pergunta:** Os documentos recuperados são os certos?

*   **Métricas / Checks:**
    *   Top-K contém a fonte correta?
    *   Similaridade semântica (cosine score).
    *   Coverage: todos os conceitos da pergunta estão presentes?
*   **Prática comum:**
    *   Recall@K (ex: a resposta correta aparece no top-5?).
    *   Threshold mínimo de similaridade.

> 👉 **Se falhar aqui, o resto não importa.**

### 2️⃣ Groundedness (Fidelidade à Fonte)
**Pergunta:** A resposta é 100% suportada pelos docs?

*   **Técnicas efetivas:**
    *   **LLM-as-Judge:** "Cada afirmação da resposta pode ser inferida a partir do contexto?"
    *   Sentence-level grounding.
    *   Citation check (cada parágrafo aponta para uma fonte).
*   **Exemplo de prompt avaliador:**
    > You are a rigorous evaluator. Given the answer and the context below, list any claims in the answer that are NOT supported by the context. If all claims are supported, output "Grounded".

### 3️⃣ Correção Factual
**Pergunta:** Mesmo sendo grounded, está correta?

*   **Checks:**
    *   Datas, números, nomes.
    *   Consistência entre múltiplas fontes.
    *   Re-execução com seed diferente.

> 👉 **Em dados corporativos, erros factuais = perda de confiança imediata.**

### 4️⃣ Relevância da Resposta (Answer Relevance)
**Pergunta:** A resposta realmente responde à pergunta?

*   **Métricas:**
    *   Answer-question similarity.
    *   Classificador on-topic / off-topic.
    *   "Partial answer" detection.
*   **Exemplo:**
    *   Pergunta: "Qual KPI mostra atraso de fornecedor?"
    *   Resposta: explica KPIs genéricos → ❌

### 5️⃣ Completeza (Completeness)
**Pergunta:** A resposta está incompleta?

*   **Avaliação:**
    *   Todos os sub-itens foram cobertos?
    *   O usuário precisaria perguntar de novo?

> 👉 **Muito comum em RAG com chunks pequenos.**

---

## 2. LLM-as-Judge (Padrão de Mercado)

Hoje é o padrão mais usado em produção.

*   **Avaliações típicas:**
    *   `is_grounded` (Sim/Não)
    *   `is_relevant` (Sim/Não/Parcial)
    *   `factual_consistency`
    *   `completeness_score` (0–1)
*   **Prompt exemplo (simplificado):**
    > Score from 0 to 1 how well the answer is supported by the provided context. Explain briefly.

> 👉 **Dica:** Use outro modelo forte (ex: GPT-4o, Claude 3.5 Sonnet) ou temperatura 0 para a avaliação.

---

## 3. Avaliação no Nível de Chunk

Técnica avançada, mas poderosa.

*   **Método:** Cada frase da resposta → Verifica se existe pelo menos um chunk que suporta.
*   **Red flags:**
    *   Frases "criativas" (alucinação).
    *   Conclusões não explícitas nos docs.

---

## 4. Métricas Práticas (Produção)

| Dimensão | Métrica |
| :--- | :--- |
| **Retrieval** | Recall@K |
| **Grounding** | Groundedness score |
| **Factual** | Contradiction rate |
| **Relevância** | Answer relevance |
| **UX** | User re-ask rate |

> 👉 **Re-ask rate alto = RAG ruim.**

---

## 5. Golden Dataset (Essencial)

Para testar de verdade, crie um dataset contendo:
1.  **Pergunta** (Query)
2.  **Docs esperados** (Ground Truth Context)
3.  **Resposta esperada** (Ground Truth Answer)

**Use para:**
*   Testes de regressão automatizados.
*   Comparar performance de embeddings diferentes.
*   Trocar modelos de LLM sem medo de quebrar a qualidade.

---

## 6. Guardrails para RAG Errado

Bloqueios inteligentes para evitar alucinações:
*   **Similarity muito baixa** → Responder: "Não encontrei informação suficiente nos documentos."
*   **Groundedness < threshold** → Pedir confirmação ou avisar: "Esta resposta pode não ser precisa."
*   **Contradições detectadas** → Fallback humano ou resposta conservadora.

---

## 7. Sinais de RAG Ruim (na prática)

*   ❌ Respostas muito confiantes mas sem fonte citada.
*   ❌ Respostas genéricas demais (que poderiam ser dadas sem os documentos).
*   ❌ Varia muito entre execuções (instabilidade).
*   ❌ Usuário corrige o bot frequentemente.

---

## 8. Arquitetura de Avaliação (Resumo)

Abaixo, um fluxo de como integrar a avaliação no seu pipeline:

```mermaid
graph TD
    Query --> Retriever
    Retriever --> Docs
    Docs --> LLM_Answer[LLM Generates Answer]
    LLM_Answer --> RAG_Evaluator{RAG Evaluator<br/>(LLM-as-Judge)}
    
    RAG_Evaluator -- grounded? --> Decision
    RAG_Evaluator -- relevant? --> Decision
    RAG_Evaluator -- correct? --> Decision
    
    Decision -- Pass --> Return[Return to User]
    Decision -- Fail --> Regenerate[Regenerate / Refine]
    Decision -- Critical Fail --> Escalate[Fallback message]
```

## 🎯 Recomendação para o seu contexto

Considerando este projeto e dados corporativos:
1.  **Similarity threshold**: Implementado (0.50).
2.  **Citações**: Implemente na UI para mostrar a fonte (já retornamos `source` no JSON).
3.  **LLM-as-Judge**: Futuro passo para garantir que a resposta não está alucinando sobre os dados.
